package xutil

import (
	"fmt"
	"math/rand"
	"strings"
	"time"
)

func F随机字符串(l int) string {
	return F获取随机字符串(l)
}

const (
// V随机基字符串 = "0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"
)

// 传一个就是最大值、两个就是最大值和最小值
func F随机一个数字(args ...int) int {
	l := len(args)
	min := 0   // 定义范围的最小值
	max := 0   // 定义范围的最大值
	switch l { // 获取参数
	case 0:
		return 0
	case 1:
		max = args[0]
	case 2:
		max = args[0]
		min = args[1]
	}
	rand.Seed(time.Now().UnixNano())  // 初始化随机种子
	return rand.Intn(max-min+1) + min // 生成随机数
}

func F随机一个小数(args ...float64) float64 {
	l := len(args)
	min := float64(0) // 定义范围的最小值
	max := float64(0) // 定义范围的最大值
	switch l {        // 获取参数
	case 0:
		return 0
	case 1:
		max = args[0]
	case 2:
		max = args[0]
		min = args[1]
	}
	rand.Seed(time.Now().UnixNano()) // 初始化随机种子
	return min + rand.Float64()*(max-min)
}

// 获取随机字符串
func F获取随机字符串(length int) string {
	r := rand.New(rand.NewSource(time.Now().UnixNano()))
	b := []byte(基础字符)
	var result []byte
	for i := 0; i < length; i++ {
		result = append(result, b[r.Intn(len(b))])
	}
	return string(result)
}

var 基础字符 string = "2r4WUZhdYzuaBmfK8ENqv1IlGo0xHTFPcOJkV7QXyngpMe63SDCtjAsw5i9RbL"

//var any1 string = "0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"

// 10进制转任意进制
func F10进制转62进制(num int) string {
	n := len(基础字符)
	new_num_str := ""
	var remainder int
	for num != 0 {
		remainder = num % n
		new_num_str = string(基础字符[remainder]) + new_num_str
		num = num / n
	}
	return new_num_str
}
func Fint64进制转62进制(num int64) string {
	return F10进制转62进制(int(num))
}

// map根据value找key
func findkey(in string) int {
	result := -1
	for i := 0; i < len(基础字符); i++ {
		if in == string(基础字符[i]) {
			return i
		}
	}
	return result
}
func pow(x, y int) int {
	if y == 0 {
		return 1
	}
	n := x
	for {
		if y == 1 {
			break
		}
		n *= x
		y--
	}
	return n
}

func F62转int64(str string) int64 {
	return int64(F62进制转10进制(str))
}

// 任意进制转10进制
func F62进制转10进制(num string) int {
	n := len(基础字符)
	var new_num int
	new_num = 0
	nNum := len(strings.Split(num, "")) - 1
	for _, value := range strings.Split(num, "") {
		tmp := findkey(value)
		if tmp != -1 {
			new_num = new_num + tmp*pow(n, nNum)
			nNum = nNum - 1
		} else {
			break
		}
	}
	return new_num
}

// 生成随机验证码
func F随机生成验证码(width int) string {
	numeric := [10]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
	r := len(numeric)
	ti := time.Now().UnixNano()
	var sb strings.Builder
	for i := 0; i < width; i++ {
		rand.Seed(ti + int64(i))
		fmt.Fprintf(&sb, "%d", numeric[rand.Intn(r)])
	}
	return sb.String()
}
